More bit manipulation speedups
authorMatthias Clasen <mclasen@redhat.com>
Wed, 9 Sep 2015 18:09:21 +0000 (14:09 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 9 Sep 2015 18:09:21 +0000 (14:09 -0400)
The same trick that was applied to _gtk_css_change_for_child in
the previous commit can be applied to _gtk_css_change_for_sibling
as well, and that is what this commit does.

With both functions converted, gtk_css_change_translate is no
longer needed and gets dropped.

gtk/gtkcsstypes.c

index 3a848704b20ea319d198423dea09aaf260a24343..e14ab2ce1cc0854a65b1b8eeba7b853fb9b706cc 100644 (file)
 #include "gtkcssnumbervalueprivate.h"
 #include "gtkstylecontextprivate.h"
 
-typedef struct _GtkCssChangeTranslation GtkCssChangeTranslation;
-struct _GtkCssChangeTranslation {
-  GtkCssChange from;
-  GtkCssChange to;
-};
-
-static GtkCssChange
-gtk_css_change_translate (GtkCssChange                   match,
-                         const GtkCssChangeTranslation *translations,
-                         guint                         n_translations)
-{
-  GtkCssChange result = match;
-  guint i;
-
-  for (i = 0; i < n_translations; i++)
-    {
-      if (match & translations[i].from)
-        {
-          result &= ~translations[i].from;
-          result |= translations[i].to;
-        }
-    }
-
-  return result;
-}
-
 GtkCssChange
 _gtk_css_change_for_sibling (GtkCssChange match)
 {
-  static const GtkCssChangeTranslation table[] = {
-    { GTK_CSS_CHANGE_CLASS, GTK_CSS_CHANGE_SIBLING_CLASS },
-    { GTK_CSS_CHANGE_NAME, GTK_CSS_CHANGE_SIBLING_NAME },
-    { GTK_CSS_CHANGE_ID, GTK_CSS_CHANGE_SIBLING_ID },
-    { GTK_CSS_CHANGE_FIRST_CHILD, GTK_CSS_CHANGE_SIBLING_FIRST_CHILD },
-    { GTK_CSS_CHANGE_LAST_CHILD, GTK_CSS_CHANGE_SIBLING_LAST_CHILD },
-    { GTK_CSS_CHANGE_NTH_CHILD, GTK_CSS_CHANGE_NTH_CHILD | GTK_CSS_CHANGE_SIBLING_NTH_CHILD },
-    { GTK_CSS_CHANGE_NTH_LAST_CHILD, GTK_CSS_CHANGE_NTH_LAST_CHILD | GTK_CSS_CHANGE_SIBLING_NTH_LAST_CHILD },
-    { GTK_CSS_CHANGE_STATE, GTK_CSS_CHANGE_SIBLING_STATE },
-    { GTK_CSS_CHANGE_SOURCE, 0 },
-    { GTK_CSS_CHANGE_PARENT_STYLE, 0 }
-  };
+#define BASE_STATES ( GTK_CSS_CHANGE_CLASS \
+                    | GTK_CSS_CHANGE_NAME \
+                    | GTK_CSS_CHANGE_ID \
+                    | GTK_CSS_CHANGE_FIRST_CHILD \
+                    | GTK_CSS_CHANGE_LAST_CHILD \
+                    | GTK_CSS_CHANGE_NTH_CHILD \
+                    | GTK_CSS_CHANGE_NTH_LAST_CHILD \
+                    | GTK_CSS_CHANGE_STATE )
+
+#define SIBLING_SHIFT 8
 
-  return gtk_css_change_translate (match, table, G_N_ELEMENTS (table)); 
+  return (match & ~(BASE_STATES|GTK_CSS_CHANGE_SOURCE|GTK_CSS_CHANGE_PARENT_STYLE)) | ((match & BASE_STATES) << SIBLING_SHIFT);
+
+#undef BASE_STATES
+#undef SIBLING_SHIFT
 }
 
 GtkCssChange
@@ -90,6 +65,9 @@ _gtk_css_change_for_child (GtkCssChange match)
 #define PARENT_SHIFT 16
 
   return (match & ~(BASE_STATES|GTK_CSS_CHANGE_SOURCE|GTK_CSS_CHANGE_PARENT_STYLE)) | ((match & BASE_STATES) << PARENT_SHIFT);
+
+#undef BASE_STATES
+#undef PARENT_SHIFT
 }
 
 void